//配置路由信息的地方

//引入vue
import Vue from 'vue';
//引入vue-router
import VueRouter from 'vue-router';
//使用插件
Vue.use(VueRouter);
//引入routes配置信息
import routes from './routes'

//引入store
import store from '@/store'

//先把VueRouter原型对象的push,先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

//重写push|replace方法
//第一个参数:告诉原来的push方法，往哪里跳转(传递哪些参数)
//第二个参数:成功的回调
//第三个参数:失败的回调
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        //call||apply的区别
        //相同点:都可以调用函数一次,都可以篡改函数的上下文,即this指向
        //不同点:call与apply传递参数,call传递参数用逗号隔开,apply方法执行,传递数组
        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(this, location, () => { }, () => { });
    }
}

VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(this, location, () => { }, () => { });
    }
}

//配置路由 对外暴露VueRouter类的实例
let router = new VueRouter({
    routes,
    //控制路由跳转后滚动到哪个位子 
    scrollBehavior(to, from, savedPosition) {
        // 返回的y 代表设置滚动条在最上方
        return { y: 0 }
    }
})

//全局前置守卫 (在路由跳转之前进行判断)
router.beforeEach(async (to, from, next) => {
    //to:可以获取到要跳转到哪个路由的信息
    //from:可以获取到从哪个路由而来
    //next:放行函数  next();放行   next('/login')放行到指定路由  next(false)中断当前导航 
    // next();
    // console.log(store);
    //用户登录了,才会有token
    let token = store.state.user.token;
    //用户信息
    let name = store.state.user.userInfo.name;

    //用户已经登陆了
    if (token) {
        //用户已经登陆了还想去login就阻止,停留在首页
        if (to.path == '/login' || to.path == '/register') {
            next('/home')
        } else {
            //登录了,去的不是login 是其他的【home,search,detail,shopcart】
            //如果用户名已有
            if (name) {
                //这里为什么要用name来判断:是因为userInfo是对象就算是空也是真,所以就用里面的字段name来判断  
                //登陆了有用户信息就直接放行
                next();
            } else {
                //没有用户信息,派发action,让仓库存储用户信息再跳转
                //在路由跳转之前获取用户信息
                try {
                    //获取用户信息成功
                    await store.dispatch('getUserInfo')
                    //放行
                    next()
                } catch (error) {
                    //token失效了 获取不到用户信息 重新登录
                    //清除token 
                    await store.dispatch('userLogout')
                    //清除成功
                    next('/login')
                }
            }

        }
    } else {
        //未登录 交易相关(trade)、支付相关(pay、paysuccess)、用户中心(center)相关不能去 去这些路由需要跳转到登录页  不是这些就放行
        let toPath = to.path;
        if (to.path.indexOf('/trade') != -1 || to.path.indexOf('/pay') != -1 || to.path.indexOf('/center') != -1) {
            //把未登录时想去而没有去成的信息  存储在地址栏中
            next('/login?redirect=' + toPath)
        } else {
            // 不是这些就放行
            next();
        }
    }
})

export default router;